home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 2 / Gold Medal Software Volume 2 (Gold Medal) (1994).iso / prog / asm_n_z.arj / SPRITES1.ASM < prev    next >
Assembly Source File  |  1986-05-27  |  23KB  |  541 lines

  1. ;
  2. ; *** Listing 1 ***
  3. ;
  4. ;This program demonstrates the use of a set of routines which
  5. ; allow smooth, non-flickering, and non-destructive animation
  6. ; of objects on an IBM CGA or EGA graphics adapter. The program
  7. ; moves two helicopters and a balloon along programmed paths while
  8. ; internally animating the helicopter's roters, and orientation. You
  9. ; will see no undesirable fringe or overlap effects. Objects look
  10. ; as if they are in separate planes, and blank areas within an object
  11. ; such as the windows of the helicopters appear to be transparent.
  12. ;
  13. ; Link with Listings 2 and 3 with the command:
  14. ;    link sprites1+sprites2+sprites3;
  15. ; to generate the executable sprite application file sprites1.exe.
  16. ;
  17. stack    segment para stack 'STACK'
  18.     db    100 dup('Stack')
  19. stack    ends
  20. ;
  21. ;Segment used to hold memory image of the background. It is used to
  22. ; restore the background before an object is moved.
  23. ;
  24. background_segment  segment para 'DATA'
  25.     db    4000h-((4000h-16000)/2) dup(0) ;last 192 bytes of the
  26. background_segment  ends               ; 16K video memory
  27. ;                           ; buffer are never used
  28. cseg    segment para public 'cseg'
  29.     assume    cs:cseg,ds:cseg,es:nothing
  30.     extrn    byte_move_form_driver:near
  31.     extrn    initialize:near,terminate:near,object_services:near
  32.     extrn    vert_int_modulo_count:word
  33.     extrn    put_objects_on_screen:far
  34. ;
  35. ;The flag below must be set properly before assembling this program
  36. ;
  37. ega    equ  0 ;1 to assemble for use on an Enhanced Graphics Adapter
  38.            ;0 to assemble for use on a Color Graphics Adapter
  39. cga    equ  (ega xor 1) ;the opposite status of ega
  40. ;
  41. if ega
  42. old_vert_count    dw    0    ;holds number used to synchronize this
  43.                 ; program to vertical interrupt
  44. endif
  45. ;
  46. screen_buffer_adr    equ    0b800h        ;video mode 4's buffer
  47.                         ; paragraph address
  48. ;
  49. num_objects    equ    3    ;this program will move three objects
  50. ;
  51. ;Below is a table which holds all the parameters which govern the
  52. ; movement of the three individual objects
  53. x        dw             15,           38,          64
  54. y        dw             90,          180,         164
  55. xinc        dw              1,        0,          -1
  56. yinc        dw              0,           -2,           0
  57. form        dw       bcptr_rt_tbl,      balloon_tbl,     rcptr_lft_tbl
  58. formbase    dw       bcptr_rt_tbl,      balloon_tbl,     rcptr_lft_tbl
  59. formmax     dw bcptr_rt_tbl_max,  balloon_tbl_max, rcptr_lft_tbl_max
  60. control     dw      copter1_cinit,    balloon_cinit,     copter0_cinit
  61. controlbase dw    copter1_control,  balloon_control,   copter0_control
  62. controlmax  dw copter1_cntl_max, balloon_cntl_max,  copter0_cntl_max
  63. delay        dw             01,           01,          01
  64. delaybase   dw             04,           12,          06
  65. repeat        dw             47,           91,          55
  66. ;
  67. ;Below are lists of parameters which control the sequence of
  68. ; parameters used to define the movement patterns, and shapes.
  69. ; The parameters are listed in the following order:
  70. ;    xinc, yinc, form, formmax, delay, repeat
  71. ;
  72.  
  73. copter0_control dw -1,0
  74.         dw rcptr_lft_tbl,rcptr_lft_tbl_max,06,54
  75. copter0_cinit    dw 0,-2
  76.         dw rcptr_lft_tbl,rcptr_lft_tbl_max,06,35
  77.         dw 1,0
  78.         dw rcptr_rt_tbl,rcptr_rt_tbl_max,06,4
  79.         dw 1,2
  80.         dw rcptr_rt_tbl,rcptr_rt_tbl_max,08,10
  81.         dw 1,-2
  82.         dw rcptr_rt_tbl,rcptr_rt_tbl_max,08,8
  83.         dw 1,-2
  84.         dw rcptr_rt_tbl,rcptr_rt_tbl_max,08,4
  85.         dw 0,0
  86.         dw rcptr_rt_tbl,rcptr_rt_tbl_max,10,10
  87.         dw 1,-2
  88.         dw rcptr_rt_tbl,rcptr_rt_tbl_max,08,4
  89.         dw 1,-2
  90.         dw rcptr_rt_tbl,rcptr_rt_tbl_max,08,9
  91.         dw 1,2
  92.         dw rcptr_rt_tbl,rcptr_rt_tbl_max,08,15
  93.         dw 0,2
  94.         dw rcptr_rt_tbl,rcptr_rt_tbl_max,10,35
  95. copter0_cntl_max label     byte
  96. ;
  97. copter1_control dw 1,0
  98.         dw bcptr_rt_tbl,bcptr_rt_tbl_max,04,46
  99. copter1_cinit    dw -1,0
  100.         dw bcptr_lft_tbl,bcptr_lft_tbl_max,04,46
  101.         dw 1,0
  102.         dw bcptr_rt_tbl,bcptr_rt_tbl_max,04,46
  103.         dw -1,0
  104.         dw bcptr_lft_tbl,bcptr_lft_tbl_max,04,46
  105.         dw 0,0
  106.         dw disappear_table,disappear_table_max,300,1
  107. copter1_cntl_max label     byte
  108. ;
  109. balloon_control dw    0,-2
  110.         dw    balloon_tbl,balloon_tbl_max,12,70
  111. balloon_cinit    dw    0,2
  112.         dw    balloon_tbl,balloon_tbl_max,12,70
  113. balloon_cntl_max     label   byte
  114. ;
  115. ;Below are tables used to sequence the internal animation
  116. ;
  117. rcptr_lft_tbl       label   word
  118.     dw    rcopter_left0
  119.     dw    rcopter_left1
  120. rcptr_lft_tbl_max  label   word
  121. ;
  122. rcptr_rt_tbl     label     word
  123.     dw    rcopter_right0
  124.     dw    rcopter_right1
  125. rcptr_rt_tbl_max label     word
  126. ;
  127. bcptr_lft_tbl       label   word
  128.     dw    bcopter_left0
  129.     dw    bcopter_left1
  130. bcptr_lft_tbl_max  label   word
  131. ;
  132. bcptr_rt_tbl     label     word
  133.     dw    bcopter_right0
  134.     dw    bcopter_right1
  135. bcptr_rt_tbl_max label     word
  136. ;
  137. balloon_tbl          label   word
  138.     dw    balloon
  139. balloon_tbl_max       label   word
  140. ;
  141. disappear_table       label   word
  142.     dw    0ffffh
  143. disappear_table_max      label   word
  144. ;
  145. ;Below are the forms used to define the various images of the objects
  146. ; in a form suitable for an AND-OR type form driver. The format is:
  147. ;    byte 0 - height in lines (h)
  148. ;    byte 1 - width in bytes  (w)
  149. ;    followed by w X h (mask word, image word) pairs.
  150. ;
  151. rcopter_left0    label    byte
  152.     DB  00Eh, 006h, 000h, 000h, 0FFh, 0FFh, 000h, 00Fh, 0FFh, 0F0h
  153.     DB  0FFh, 0FFh, 000h, 000h, 0FFh, 0F0h, 000h, 00Fh, 000h, 00Fh
  154.     DB  0FFh, 0F0h, 0FFh, 0FFh, 000h, 000h, 0FFh, 0F0h, 000h, 00Fh
  155.     DB  0FFh, 0FFh, 000h, 000h, 0FFh, 0FFh, 000h, 000h, 0FCh, 000h
  156.     DB  002h, 0AAh, 003h, 0FFh, 0A8h, 000h, 0FFh, 0FFh, 000h, 000h
  157.     DB  0F3h, 0FFh, 008h, 000h, 0C0h, 0FFh, 02Ah, 000h, 0FFh, 03Fh
  158.     DB  000h, 0C0h, 0CFh, 0FFh, 020h, 000h, 0F0h, 03Fh, 00Ah, 080h
  159.     DB  0FFh, 03Fh, 000h, 0C0h, 03Fh, 0FFh, 080h, 000h, 0F0h, 00Ch
  160.     DB  00Ah, 0A2h, 03Fh, 03Fh, 080h, 0C0h, 03Fh, 0FFh, 080h, 000h
  161.     DB  0F0h, 003h, 00Ah, 0A8h, 0C0h, 000h, 03Fh, 0FFh, 03Fh, 0FFh
  162.     DB  080h, 000h, 0C0h, 00Ch, 02Ah, 0A2h, 03Fh, 03Fh, 080h, 0C0h
  163.     DB  000h, 000h, 0AAh, 0AAh, 000h, 03Fh, 0AAh, 080h, 0FFh, 03Fh
  164.     DB  000h, 0C0h, 0C0h, 000h, 02Ah, 0AAh, 000h, 0FFh, 0AAh, 000h
  165.     DB  0FFh, 03Fh, 000h, 0C0h, 0F0h, 000h, 00Ah, 0AAh, 003h, 0FFh
  166.     DB  0A8h, 000h, 0FFh, 0FFh, 000h, 000h, 03Ch, 0FFh, 0C3h, 000h
  167.     DB  0CFh, 03Fh, 030h, 0C0h, 0FFh, 0FFh, 000h, 000h, 0C0h, 000h
  168.     DB  03Fh, 0FFh, 000h, 0FFh, 0FFh, 000h, 0FFh, 0FFh, 000h, 000h
  169. rcopter_left1    label    byte
  170.     DB  00Eh, 006h, 000h, 000h, 0FFh, 0FFh, 000h, 00Fh, 0FFh, 0F0h
  171.     DB  0FFh, 0FFh, 000h, 000h, 000h, 000h, 0FFh, 0FFh, 0FFh, 0FFh
  172.     DB  000h, 000h, 0FFh, 0FFh, 000h, 000h, 0FFh, 0F0h, 000h, 00Fh
  173.     DB  0FFh, 0FFh, 000h, 000h, 0FFh, 0FFh, 000h, 000h, 0FCh, 000h
  174.     DB  002h, 0AAh, 003h, 0FFh, 0A8h, 000h, 0FFh, 0FFh, 000h, 000h
  175.     DB  0F3h, 0FFh, 008h, 000h, 0C0h, 0FFh, 02Ah, 000h, 0FFh, 0FFh
  176.     DB  000h, 000h, 0CFh, 0FFh, 020h, 000h, 0F0h, 03Fh, 00Ah, 080h
  177.     DB  0F3h, 0F3h, 00Ch, 00Ch, 03Fh, 0FFh, 080h, 000h, 0F0h, 00Ch
  178.     DB  00Ah, 0A2h, 03Ch, 0CFh, 083h, 030h, 03Fh, 0FFh, 080h, 000h
  179.     DB  0F0h, 003h, 00Ah, 0A8h, 0C0h, 03Fh, 02Ah, 0C0h, 03Fh, 0FFh
  180.     DB  080h, 000h, 0C0h, 00Ch, 02Ah, 0A2h, 03Ch, 0CFh, 083h, 030h
  181.     DB  000h, 000h, 0AAh, 0AAh, 000h, 03Fh, 0AAh, 080h, 0F3h, 0F3h
  182.     DB  00Ch, 00Ch, 0C0h, 000h, 02Ah, 0AAh, 000h, 0FFh, 0AAh, 000h
  183.     DB  0FFh, 0FFh, 000h, 000h, 0F0h, 000h, 00Ah, 0AAh, 003h, 0FFh
  184.     DB  0A8h, 000h, 0FFh, 0FFh, 000h, 000h, 03Ch, 0FFh, 0C3h, 000h
  185.     DB  0CFh, 03Fh, 030h, 0C0h, 0FFh, 0FFh, 000h, 000h, 0C0h, 000h
  186.     DB  03Fh, 0FFh, 000h, 0FFh, 0FFh, 000h, 0FFh, 0FFh, 000h, 000h
  187. rcopter_right0    label    byte
  188.     DB  00Eh, 006h, 0FFh, 0FFh, 000h, 000h, 0F0h, 000h, 00Fh, 0FFh
  189.     DB  000h, 000h, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h, 0FFh, 0FFh
  190.     DB  000h, 000h, 000h, 000h, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h
  191.     DB  0FFh, 0FFh, 000h, 000h, 00Fh, 0FFh, 0F0h, 000h, 0FFh, 0FFh
  192.     DB  000h, 000h, 0FFh, 0C0h, 000h, 02Ah, 000h, 03Fh, 0AAh, 080h
  193.     DB  0FCh, 0FFh, 003h, 000h, 0FFh, 003h, 000h, 0A8h, 0FFh, 0CFh
  194.     DB  000h, 020h, 0FCh, 0FFh, 003h, 000h, 0FCh, 00Fh, 002h, 0A0h
  195.     DB  0FFh, 0F3h, 000h, 008h, 0FCh, 0FCh, 003h, 002h, 030h, 00Fh
  196.     DB  08Ah, 0A0h, 0FFh, 0FCh, 000h, 002h, 000h, 003h, 0FFh, 0FCh
  197.     DB  0C0h, 00Fh, 02Ah, 0A0h, 0FFh, 0FCh, 000h, 002h, 0FCh, 0FCh
  198.     DB  003h, 002h, 030h, 003h, 08Ah, 0A8h, 0FFh, 0FCh, 000h, 002h
  199.     DB  0FCh, 0FFh, 003h, 000h, 0FCh, 000h, 002h, 0AAh, 000h, 000h
  200.     DB  0AAh, 0AAh, 0FCh, 0FFh, 003h, 000h, 0FFh, 000h, 000h, 0AAh
  201.     DB  000h, 003h, 0AAh, 0A8h, 0FFh, 0FFh, 000h, 000h, 0FFh, 0C0h
  202.     DB  000h, 02Ah, 000h, 00Fh, 0AAh, 0A0h, 0FFh, 0FFh, 000h, 000h
  203.     DB  0FCh, 0F3h, 003h, 00Ch, 0FFh, 03Ch, 000h, 0C3h, 0FFh, 0FFh
  204.     DB  000h, 000h, 0FFh, 000h, 000h, 0FFh, 000h, 003h, 0FFh, 0FCh
  205. rcopter_right1    label    byte
  206.     DB  00Eh, 006h, 0FFh, 0FFh, 000h, 000h, 0F0h, 000h, 00Fh, 0FFh
  207.     DB  000h, 000h, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h, 0F0h, 000h
  208.     DB  00Fh, 0FFh, 00Fh, 0FFh, 0F0h, 000h, 0FFh, 0FFh, 000h, 000h
  209.     DB  0FFh, 0FFh, 000h, 000h, 00Fh, 0FFh, 0F0h, 000h, 0FFh, 0FFh
  210.     DB  000h, 000h, 0FFh, 0C0h, 000h, 02Ah, 000h, 03Fh, 0AAh, 080h
  211.     DB  0FFh, 0FFh, 000h, 000h, 0FFh, 003h, 000h, 0A8h, 0FFh, 0CFh
  212.     DB  000h, 020h, 0CFh, 0CFh, 030h, 030h, 0FCh, 00Fh, 002h, 0A0h
  213.     DB  0FFh, 0F3h, 000h, 008h, 0F3h, 03Ch, 00Ch, 0C2h, 030h, 00Fh
  214.     DB  08Ah, 0A0h, 0FFh, 0FCh, 000h, 002h, 0FCh, 003h, 003h, 0A8h
  215.     DB  0C0h, 00Fh, 02Ah, 0A0h, 0FFh, 0FCh, 000h, 002h, 0F3h, 03Ch
  216.     DB  00Ch, 0C2h, 030h, 003h, 08Ah, 0A8h, 0FFh, 0FCh, 000h, 002h
  217.     DB  0CFh, 0CFh, 030h, 030h, 0FCh, 000h, 002h, 0AAh, 000h, 000h
  218.     DB  0AAh, 0AAh, 0FFh, 0FFh, 000h, 000h, 0FFh, 000h, 000h, 0AAh
  219.     DB  000h, 003h, 0AAh, 0A8h, 0FFh, 0FFh, 000h, 000h, 0FFh, 0C0h
  220.     DB  000h, 02Ah, 000h, 00Fh, 0AAh, 0A0h, 0FFh, 0FFh, 000h, 000h
  221.     DB  0FCh, 0F3h, 003h, 00Ch, 0FFh, 03Ch, 000h, 0C3h, 0FFh, 0FFh
  222.     DB  000h, 000h, 0FFh, 000h, 000h, 0FFh, 000h, 003h, 0FFh, 0FCh
  223. bcopter_left0    label    byte
  224.     DB  00Eh, 006h, 000h, 000h, 0FFh, 0FFh, 000h, 00Fh, 0FFh, 0F0h
  225.     DB  0FFh, 0FFh, 000h, 000h, 000h, 000h, 0FFh, 0FFh, 0FFh, 0FFh
  226.     DB  000h, 000h, 0FFh, 0FFh, 000h, 000h, 0FFh, 0F0h, 000h, 00Fh
  227.     DB  0FFh, 0FFh, 000h, 000h, 0FFh, 0FFh, 000h, 000h, 0FCh, 000h
  228.     DB  001h, 055h, 003h, 0FFh, 054h, 000h, 0FFh, 0FFh, 000h, 000h
  229.     DB  0F3h, 0FFh, 004h, 000h, 0C0h, 0FFh, 015h, 000h, 0FFh, 0FFh
  230.     DB  000h, 000h, 0CFh, 0FFh, 010h, 000h, 0F0h, 03Fh, 005h, 040h
  231.     DB  0F3h, 0F3h, 00Ch, 00Ch, 03Fh, 0FFh, 040h, 000h, 0F0h, 00Ch
  232.     DB  005h, 051h, 03Ch, 0CFh, 043h, 030h, 03Fh, 0FFh, 040h, 000h
  233.     DB  0F0h, 003h, 005h, 054h, 0C0h, 03Fh, 015h, 0C0h, 03Fh, 0FFh
  234.     DB  040h, 000h, 0C0h, 00Ch, 015h, 051h, 03Ch, 0CFh, 043h, 030h
  235.     DB  000h, 000h, 055h, 055h, 000h, 03Fh, 055h, 040h, 0F3h, 0F3h
  236.     DB  00Ch, 00Ch, 0C0h, 000h, 015h, 055h, 000h, 0FFh, 055h, 000h
  237.     DB  0FFh, 0FFh, 000h, 000h, 0F0h, 000h, 005h, 055h, 003h, 0FFh
  238.     DB  054h, 000h, 0FFh, 0FFh, 000h, 000h, 03Ch, 0FFh, 0C3h, 000h
  239.     DB  0CFh, 03Fh, 030h, 0C0h, 0FFh, 0FFh, 000h, 000h, 0C0h, 000h
  240.     DB  03Fh, 0FFh, 000h, 0FFh, 0FFh, 000h, 0FFh, 0FFh, 000h, 000h
  241. bcopter_left1    label    byte
  242.     DB  00Eh, 006h, 000h, 000h, 0FFh, 0FFh, 000h, 00Fh, 0FFh, 0F0h
  243.     DB  0FFh, 0FFh, 000h, 000h, 0FFh, 0F0h, 000h, 00Fh, 000h, 00Fh
  244.     DB  0FFh, 0F0h, 0FFh, 0FFh, 000h, 000h, 0FFh, 0F0h, 000h, 00Fh
  245.     DB  0FFh, 0FFh, 000h, 000h, 0FFh, 0FFh, 000h, 000h, 0FCh, 000h
  246.     DB  001h, 055h, 003h, 0FFh, 054h, 000h, 0FFh, 0FFh, 000h, 000h
  247.     DB  0F3h, 0FFh, 004h, 000h, 0C0h, 0FFh, 015h, 000h, 0FFh, 03Fh
  248.     DB  000h, 0C0h, 0CFh, 0FFh, 010h, 000h, 0F0h, 03Fh, 005h, 040h
  249.     DB  0FFh, 03Fh, 000h, 0C0h, 03Fh, 0FFh, 040h, 000h, 0F0h, 00Ch
  250.     DB  005h, 051h, 03Fh, 03Fh, 040h, 0C0h, 03Fh, 0FFh, 040h, 000h
  251.     DB  0F0h, 003h, 005h, 054h, 0C0h, 000h, 03Fh, 0FFh, 03Fh, 0FFh
  252.     DB  040h, 000h, 0C0h, 00Ch, 015h, 051h, 03Fh, 03Fh, 040h, 0C0h
  253.     DB  000h, 000h, 055h, 055h, 000h, 03Fh, 055h, 040h, 0FFh, 03Fh
  254.     DB  000h, 0C0h, 0C0h, 000h, 015h, 055h, 000h, 0FFh, 055h, 000h
  255.     DB  0FFh, 03Fh, 000h, 0C0h, 0F0h, 000h, 005h, 055h, 003h, 0FFh
  256.     DB  054h, 000h, 0FFh, 0FFh, 000h, 000h, 03Ch, 0FFh, 0C3h, 000h
  257.     DB  0CFh, 03Fh, 030h, 0C0h, 0FFh, 0FFh, 000h, 000h, 0C0h, 000h
  258.     DB  03Fh, 0FFh, 000h, 0FFh, 0FFh, 000h, 0FFh, 0FFh, 000h, 000h
  259. bcopter_right0    label    byte
  260.     DB  00Eh, 006h, 0FFh, 0FFh, 000h, 000h, 0F0h, 000h, 00Fh, 0FFh
  261.     DB  000h, 000h, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h, 0FFh, 0FFh
  262.     DB  000h, 000h, 000h, 000h, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h
  263.     DB  0FFh, 0FFh, 000h, 000h, 00Fh, 0FFh, 0F0h, 000h, 0FFh, 0FFh
  264.     DB  000h, 000h, 0FFh, 0C0h, 000h, 015h, 000h, 03Fh, 055h, 040h
  265.     DB  0FCh, 0FFh, 003h, 000h, 0FFh, 003h, 000h, 054h, 0FFh, 0CFh
  266.     DB  000h, 010h, 0FCh, 0FFh, 003h, 000h, 0FCh, 00Fh, 001h, 050h
  267.     DB  0FFh, 0F3h, 000h, 004h, 0FCh, 0FCh, 003h, 001h, 030h, 00Fh
  268.     DB  045h, 050h, 0FFh, 0FCh, 000h, 001h, 000h, 003h, 0FFh, 0FCh
  269.     DB  0C0h, 00Fh, 015h, 050h, 0FFh, 0FCh, 000h, 001h, 0FCh, 0FCh
  270.     DB  003h, 001h, 030h, 003h, 045h, 054h, 0FFh, 0FCh, 000h, 001h
  271.     DB  0FCh, 0FFh, 003h, 000h, 0FCh, 000h, 001h, 055h, 000h, 000h
  272.     DB  055h, 055h, 0FCh, 0FFh, 003h, 000h, 0FFh, 000h, 000h, 055h
  273.     DB  000h, 003h, 055h, 054h, 0FFh, 0FFh, 000h, 000h, 0FFh, 0C0h
  274.     DB  000h, 015h, 000h, 00Fh, 055h, 050h, 0FFh, 0FFh, 000h, 000h
  275.     DB  0FCh, 0F3h, 003h, 00Ch, 0FFh, 03Ch, 000h, 0C3h, 0FFh, 0FFh
  276.     DB  000h, 000h, 0FFh, 000h, 000h, 0FFh, 000h, 003h, 0FFh, 0FCh
  277. bcopter_right1    label    byte
  278.     DB  00Eh, 006h, 0FFh, 0FFh, 000h, 000h, 0F0h, 000h, 00Fh, 0FFh
  279.     DB  000h, 000h, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h, 0F0h, 000h
  280.     DB  00Fh, 0FFh, 00Fh, 0FFh, 0F0h, 000h, 0FFh, 0FFh, 000h, 000h
  281.     DB  0FFh, 0FFh, 000h, 000h, 00Fh, 0FFh, 0F0h, 000h, 0FFh, 0FFh
  282.     DB  000h, 000h, 0FFh, 0C0h, 000h, 015h, 000h, 03Fh, 055h, 040h
  283.     DB  0FFh, 0FFh, 000h, 000h, 0FFh, 003h, 000h, 054h, 0FFh, 0CFh
  284.     DB  000h, 010h, 0CFh, 0CFh, 030h, 030h, 0FCh, 00Fh, 001h, 050h
  285.     DB  0FFh, 0F3h, 000h, 004h, 0F3h, 03Ch, 00Ch, 0C1h, 030h, 00Fh
  286.     DB  045h, 050h, 0FFh, 0FCh, 000h, 001h, 0FCh, 003h, 003h, 054h
  287.     DB  0C0h, 00Fh, 015h, 050h, 0FFh, 0FCh, 000h, 001h, 0F3h, 03Ch
  288.     DB  00Ch, 0C1h, 030h, 003h, 045h, 054h, 0FFh, 0FCh, 000h, 001h
  289.     DB  0CFh, 0CFh, 030h, 030h, 0FCh, 000h, 001h, 055h, 000h, 000h
  290.     DB  055h, 055h, 0FFh, 0FFh, 000h, 000h, 0FFh, 000h, 000h, 055h
  291.     DB  000h, 003h, 055h, 054h, 0FFh, 0FFh, 000h, 000h, 0FFh, 0C0h
  292.     DB  000h, 015h, 000h, 00Fh, 055h, 050h, 0FFh, 0FFh, 000h, 000h
  293.     DB  0FCh, 0F3h, 003h, 00Ch, 0FFh, 03Ch, 000h, 0C3h, 0FFh, 0FFh
  294.     DB  000h, 000h, 0FFh, 000h, 000h, 0FFh, 000h, 003h, 0FFh, 0FCh
  295. balloon label    byte
  296.     DB  014h, 004h, 0FFh, 0C0h, 000h, 03Fh, 003h, 0FFh, 0FCh, 000h
  297.     DB  0FCh, 000h, 003h, 0EAh, 000h, 03Fh, 057h, 0C0h, 0F0h, 000h
  298.     DB  00Dh, 06Ah, 000h, 00Fh, 056h, 0B0h, 0C0h, 000h, 035h, 06Ah
  299.     DB  000h, 003h, 056h, 0ACh, 0C0h, 000h, 035h, 0AAh, 000h, 000h
  300.     DB  055h, 0ABh, 000h, 000h, 0D5h, 0AAh, 000h, 000h, 055h, 0ABh
  301.     DB  000h, 000h, 0D5h, 0AAh, 000h, 000h, 055h, 0ABh, 000h, 000h
  302.     DB  0D5h, 0AAh, 000h, 000h, 055h, 0ABh, 0C0h, 000h, 035h, 0AAh
  303.     DB  000h, 003h, 055h, 0ACh, 0C0h, 000h, 035h, 06Ah, 000h, 003h
  304.     DB  056h, 0ACh, 0C0h, 000h, 035h, 06Ah, 000h, 003h, 056h, 0ACh
  305.     DB  0F0h, 000h, 00Fh, 0EAh, 000h, 00Fh, 057h, 0F0h, 0F3h, 0C0h
  306.     DB  00Ch, 03Fh, 003h, 0CFh, 0FCh, 030h, 0FCh, 0FFh, 003h, 000h
  307.     DB  0FFh, 03Fh, 000h, 0C0h, 0FCh, 0FFh, 003h, 000h, 0FFh, 03Fh
  308.     DB  000h, 0C0h, 0FFh, 03Fh, 000h, 0C0h, 0FCh, 0FFh, 003h, 000h
  309.     DB  0FFh, 03Fh, 000h, 0C0h, 0FCh, 0FFh, 003h, 000h, 0FFh, 0C0h
  310.     DB  000h, 03Fh, 003h, 0FFh, 0FCh, 000h, 0FFh, 0C0h, 000h, 03Fh
  311.     DB  003h, 0FFh, 0FCh, 000h, 0FFh, 0F0h, 000h, 00Fh, 00Fh, 0FFh
  312.     DB  0F0h, 000h
  313. ;
  314. ;Below is a form for a crescent moon in a form suitable for a BYTE-MOVE
  315. ; driver. The format is:
  316. ;    byte 0 - height in lines (h)
  317. ;    byte 1 - width in bytes  (w)
  318. ;    followed by w X h image bytes
  319. ;
  320. moon    label    byte
  321.     DB    014h, 004h, 000h, 000h, 03Fh, 0FCh
  322.     DB    000h, 00Fh, 0FFh, 0FFh, 000h, 0FFh, 0FFh, 000h
  323.     DB    003h, 0FFh, 0F0h, 000h, 00Fh, 0FFh, 0C0h, 000h
  324.     DB    03Fh, 0FFh, 000h, 000h, 03Fh, 0FFh, 000h, 000h
  325.     DB    0FFh, 0FFh, 000h, 000h, 0FFh, 0FCh, 000h, 000h
  326.     DB    0FFh, 0FCh, 000h, 000h, 0FFh, 0FCh, 000h, 000h
  327.     DB    0FFh, 0FCh, 000h, 000h, 0FFh, 0FFh, 000h, 000h
  328.     DB    03Fh, 0FFh, 000h, 000h, 03Fh, 0FFh, 000h, 000h
  329.     DB    00Fh, 0FFh, 0C0h, 000h, 003h, 0FFh, 0F0h, 000h
  330.     DB    000h, 0FFh, 0FFh, 000h, 000h, 00Fh, 0FFh, 0FFh
  331.     DB    000h, 000h, 03Fh, 0FCh, 000h, 000h, 000h, 000h
  332.     DB    03Fh, 0FFh, 000h, 000h, 000h, 000h, 00Fh, 0FFh
  333.     DB    0C0h, 000h, 000h, 000h, 003h, 0FFh, 0F0h, 000h
  334.     DB    000h, 000h, 000h, 0FFh, 0FFh, 000h, 000h, 000h
  335.     DB    000h, 00Fh, 0FFh, 0FFh, 0C0h, 000h, 000h, 000h
  336. ;
  337. ;The tables below define the x,y and color of pixels which represent
  338. ; stars in a night sky.
  339. ;
  340. starx    label    byte
  341.     db     10, 50, 39, 22, 41,  2, 50, 33, 65, 41, 15, 19, 19, 54
  342.     db     34, 61, 19, 41, 22, 55, 23, 68,    8, 29, 51, 71, 39, 30
  343.     db     41,  9, 21, 13, 68, 61, 43, 70, 40, 17, 39, 19, 29, 45
  344. num_stars    equ    $-starx
  345. stary    label    byte
  346.     db    7, 33, 90,100, 80, 35, 92,172,106, 97,123,168, 42, 88
  347.     db    150, 34, 29, 90,170, 65, 39, 99,145,163,109, 78,127,166
  348.     db    169, 84, 15, 65, 99,155, 89, 58, 25, 80, 76,168, 98, 99
  349. star_color label   byte
  350.     db    1,  2,    3,  1,    2,  3,    1,  2,    3,  1,    2,  3,    1,  2
  351.     db    3,  1,    2,  3,    1,  2,    3,  1,    2,  3,    1,  2,    3,  1
  352.     db    2,  3,    1,  2,    3,  1,    2,  3,    1,  2,    3,  1,    2,  3
  353. ;
  354. start    proc    near
  355.     cld            ;count up
  356.     push    cs        ;most data is kept in code segment
  357.     pop    ds        ;
  358. ;set 320x200x4 graphics mode
  359.     mov    ax,0004h    ;graphics mode 4 is supported by both
  360.     int    10h        ; the EGA and CGA
  361. ;select palette 0
  362.     mov    ah,0bh        ;set color palette function
  363.     mov    bh,1        ;select palette to be used subfunction
  364.     mov    bl,0        ;select palette 0 (green/red/yellow)
  365.     int    10h        ;
  366. ;put stars into background buffer
  367.     mov    ax,background_segment
  368.     mov    es,ax
  369.     mov    bx,num_stars-1
  370.     mov    dl,80            ;lines are 80 bytes long
  371. next_star:
  372.     sub    di,di            ;calculate star's screen buffer
  373.     mov    al,[stary+bx]        ; address based on line number
  374.     shr    al,1            ; and byte position from tables
  375.     jnc    calc_y_offset        ;
  376.     mov    di,2000h        ;odd lines in second bank
  377. calc_y_offset:
  378.     mul    dl            ;number of even lines * 80
  379.     mov    cl,[starx+bx]        ; plus byte position in line
  380.     sub    ch,ch            ; plus odd line offset
  381.     add    ax,cx            ; is screen buffer offset
  382.     add    di,ax            ;
  383.     mov    al,[star_color+bx]  ;get the star image byte (all are
  384.     or    es:[di],al        ; single pixels) and OR it into
  385.     dec    bx            ; the background buffer.
  386.     jns    next_star        ;
  387. ;put moon into background buffer
  388.     mov    ax,background_segment
  389.     mov    es,ax            ;put forms into background buffer
  390.     mov    bx,88            ;put moon image on line 88
  391.     mov    cx,37            ; and byte 37
  392.     mov    si,offset moon        ;
  393.     call    byte_move_form_driver
  394. ;put horizon into background buffer
  395.     mov    ax,background_segment  ;horizon is two consecutive
  396.     mov    es,ax               ; red lines
  397.     mov    ax,0aaaah           ;8 red pixels
  398.     mov    di,92*80           ;point to scan line 184
  399.     mov    cx,40               ;width of screen in words
  400.     rep stosw
  401.     mov    di,92*80+2000h           ;point to scan line 185
  402.     mov    cx,40               ; and draw it
  403.     rep stosw
  404. ;copy background to display memory
  405.     mov    ax,screen_buffer_adr   ;
  406.     mov    es,ax               ;
  407.     mov    ax,background_segment  ;
  408.     mov    ds,ax               ;
  409.     sub    si,si               ;
  410.     sub    di,di               ;
  411.     mov    cx,2000h           ;
  412.     rep movsw               ;
  413. ;
  414. ;Initialize the object services routine
  415. ;
  416.     call    initialize
  417. ;
  418. ;Orchestrate the objects' movements
  419. ;
  420.     push    cs          ;object data is kept in
  421.     pop    ds          ; code segment
  422. iteration_loop:           ;sequence all objects once
  423.     mov    di,((num_objects-1) * 2) ;start with last object
  424. next_object:
  425. ;see if it's time to manipulate object
  426.     dec    [delay+di]      ;each delay count is 1/60 second
  427.     jnz    done_with_object  ; so long as program can keep up
  428. ;see if it's time to get next set of control variables
  429.     dec    [repeat+di]      ;each count is the number of
  430.     jnz    reset_delay      ; movements using the present set
  431.                   ; of control values
  432. ;get next set of control parameters
  433.     mov    si,[control+di]   ;get the addr of the parameter list
  434.     lodsw              ;get the number of bytes to move
  435.     mov    [xinc+di],ax      ; horizontally each time delay
  436.                   ; counts down to zero
  437.     lodsw              ;get the number of lines to move
  438.     mov    [yinc+di],ax      ; vertically each count down
  439.     lodsw              ;get pointer to the table of
  440.     mov    [form+di],ax      ; form addres to be sequenced though
  441.     mov    [formbase+di],ax  ;set to repeat with starting form
  442.     lodsw              ; when the end of the table is hit
  443.     mov    [formmax+di],ax   ;save end of table marker
  444.     lodsw              ;get next delay count which controls
  445.     mov    [delaybase+di],ax ; the speed
  446.     lodsw              ;get the number of times to use
  447.     mov    [repeat+di],ax      ; this new set of control parameters
  448.     cmp    [controlmax+di],si;point to next list of control
  449.     ja    save_control_base ; parameters to be used.
  450.     mov    si,[controlbase+di] ; reycle when end of list hit
  451. save_control_base:
  452.     mov    [control+di],si   ;next control list entry address
  453. ;
  454. reset_delay:
  455.     mov    ax,[delaybase+di] ;reset iteration count until
  456.     mov    [delay+di],ax      ; next manipulation of this object
  457. ;find object's new position
  458.     mov    cx,[x+di]      ;calculate new x and y positions
  459.     add    cx,[xinc+di]      ; and store them
  460.     mov    [x+di],cx      ;
  461.     mov    bx,[y+di]      ;
  462.     add    bx,[yinc+di]      ;
  463.     mov    [y+di],bx      ;
  464. ;point to new form for object so that it appears to move internally
  465.     mov    si,[form+di]      ;each time an object is counted down
  466.     inc    si          ; the form used is taken from the
  467.     inc    si          ; next address in table
  468.     cmp    [formmax+di],si   ;
  469.     ja    setform       ;
  470.     mov    si,[formbase+di]  ;
  471. setform:
  472.     mov    [form+di],si    ;cycle to the next form for the object
  473.     mov    si,[si]     ;put pointer to object's form in SI
  474.     shr    di,1        ;object number in DI
  475.                 ;BX holds line number, CX byte number
  476.     call    object_services ;register change in object's status
  477.     shl    di,1        ;turn object number into object index
  478. ;point to next object
  479. done_with_object:
  480.     dec    di
  481.     dec    di
  482.     js    check_for_keystroke ;see if finished with iteration
  483.     jmp    next_object        ; if not process next object
  484. ;
  485. ;Check for keystroke; if so, clear key & end.
  486. ;
  487. check_for_keystroke:
  488.     mov    ah,1             ;see if a char is waiting
  489.     int    16h             ;get keyboard status
  490.     jnz    getkey             ;if zero no key waiting
  491. ;
  492. ;Wait for new vertical sync (CGA) or retrace (EGA) before putting
  493. ; objects on screen to avoid undesirable screen breakup and blinking
  494. ; effects. Waiting also keeps the objects moving a constant rate.
  495. ;
  496. if cga
  497.     mov    dx,3dah            ;point to cga status register
  498. wait_for_not_vert_sync:
  499.     in    al,dx               ;wait for begining of vertical
  500.     and    al,08h               ; sunc by starting search from
  501.     jnz    wait_for_not_vert_sync ; outside of sync pulse
  502. wait_for_vert_sync:
  503.     in    al,dx               ;wait for start of sync
  504.     and    al,08h               ;
  505.     jz    wait_for_vert_sync     ;
  506. ;
  507.     pushf                   ;push flags to simulate an
  508.     call    put_objects_on_screen  ; interrupt
  509. endif
  510. if ega
  511.     mov    ax,[old_vert_count]       ;synchronize animation loop
  512. wait_for_after_interrupt:           ; to vert interrupt so it
  513.     cmp    ax,[vert_int_modulo_count] ; will run at a fixed
  514.     je    wait_for_after_interrupt   ; smooth rate
  515.     mov    ax,[vert_int_modulo_count] ;save new as old for next
  516.     mov    [old_vert_count],ax       ; time
  517. endif
  518.     jmp    iteration_loop           ;
  519.  
  520. ;
  521. ;Run is completed.
  522. ;
  523. getkey:
  524.     sub    ah,ah       ;get key that was hit
  525.     int    16h       ;
  526. done:
  527.     call    terminate  ;do any clean up required by the sprite
  528. ;               ; routines
  529. ;Set to text mode
  530. ;
  531.     mov    ax,0002h   ;set the adapter to video mode 2
  532.     int    10h       ;
  533. ;
  534. ;Return to DOS
  535. ;
  536.     mov    ax,4c00h   ;terminate program with return code of zero
  537.     int    21h       ;
  538. start    endp
  539. cseg    ends
  540.     end    start       ;program execution will start at start
  541.